#include <iostream>


/*  i++ 与 ++i 的主要区别有两个：
    1、 i++ 返回原来的值，++i 返回加1后的值。
    2、 i++ 不能作为左值，而++i 可以。
    i++：把原来的值拷贝到一个临时变量中，在原来的值的基础上加1，返回临时变量，(i++不具有原子性)
    ++i：在原来的值的基础上加1，然后返回原来的值

    i++ 返回的是 右值(临时变量)
    ++i 返回的是 左值

    左值是指表达式结束后依然存在的持久化对象，右值是指表达式结束时就不再存在的临时对象。
    所有的具名变量或者对象都是左值，而右值不具名。
    左值与右值的根本区别在于是否允许取地址&运算符获得对应的内存地址。

    并且左值引用只能绑定到左值上（常量左值引用能绑定到右值上）
    右值应用只能绑定到右值上

    常见的右值：临时变量，字面值。
*/

int main(){
    int i = 0;
    int&& j = i++;
    std::cout << j << std::endl;

    // // 出错，无法将右值引用绑定到左值上
    // int&& k = ++i;
    // // 出错，非常量引用的初始值必须为左值
    // int& m = i++;

    // 常量左值引用能绑定到右值上
    const int & m = i++;
    std::cout << m << std::endl;

    int& l = ++i;

    std::cout << l << std::endl;

    std::cout << i << std::endl;
    return 0;
}